home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / MOSCTRL.D < prev    next >
Encoding:
Modula Definition  |  1994-01-18  |  4.5 KB  |  157 lines

  1. DEFINITION MODULE MOSCtrl;
  2.  
  3. (*
  4.  * Internes Modul!
  5.  *)
  6.  
  7. FROM SYSTEM IMPORT ADDRESS, BYTE, WORD, LONGWORD;
  8.  
  9. FROM MOSGlobals IMPORT MemArea;
  10.  
  11.  
  12. VAR ProcessID: POINTER TO ADDRESS;
  13.      (*
  14.       * Zeigt auf die TOS-Variable, die den aktuellen Prozeß bezeichnet.
  15.       *)
  16.  
  17.     ModLevel: CARDINAL;
  18.      (*
  19.       * Globales Modullevel.
  20.       * Ist Eins für unterstes Level;
  21.       * Null, wenn eigener Prozeß nicht mehr aktiv (z.B. bei residenten Prg.).
  22.       *)
  23.  
  24.     BaseResident: BOOLEAN;
  25.      (*
  26.       * TRUE, wenn Basismodule resident sind.
  27.       * Bleibt auch erhalten, wenn Basisprozeß beendet wird und Prg
  28.       * resident bleibt.
  29.       *)
  30.  
  31.     BaseIsAccessory: BOOLEAN;
  32.      (*
  33.       * Zeigt an, ob BaseProcess ein ACC ist
  34.       *)
  35.  
  36.     ExitCode: INTEGER;
  37.      (*
  38.       * Erst gültig, wenn processState = 3 (term)
  39.       *)
  40.  
  41.     RealMode: CARDINAL;
  42.      (*
  43.       * Vom Linker übergeben: 0 = keine Reals, 1 = Soft, 2 = ST-FPU, 3 = TT-FPU
  44.       *)
  45.  
  46.     UsedFPU: CARDINAL;
  47.      (*
  48.       * 0: none, 1: external, 2: internal
  49.       *)
  50.  
  51.     PrgFlags: LONGWORD;
  52.      (*
  53.       * Z.Zt. unbenutzt.
  54.       *)
  55.  
  56. TYPE TermList  = POINTER TO TermEntry;
  57.      TermEntry = RECORD
  58.                    call: PROC;
  59.                    wsp : MemArea;
  60.                    next: TermList
  61.                  END;
  62.  
  63.      EnvList  = POINTER TO EnvEntry;
  64.      EnvEntry = RECORD
  65.                   call: PROC; (* PROCEDURE(start,child):BOOLEAN) *)
  66.                   wsp: MemArea;
  67.                   level: INTEGER;
  68.                   prev, next: EnvList
  69.                 END;
  70.  
  71.      RemovalList  = POINTER TO RemovalEntry;
  72.      RemovalEntry = RECORD
  73.                       next: RemovalList;
  74.                       prev: RemovalList;
  75.                       call: PROC;
  76.                       wsp: MemArea;
  77.                       reserved: ARRAY [10..15] OF WORD
  78.                     END;
  79.  
  80. VAR EnvRoot: EnvEntry;
  81.     RemovalRoot: RemovalEntry;
  82.  
  83.  
  84. TYPE PtrPDB = POINTER TO PDB;
  85.  
  86.      PDB = RECORD
  87.              layout       : CARDINAL;
  88.              basePageAddr : ADDRESS;
  89.              modLst       : POINTER TO ARRAY [1..65535] OF RECORD
  90.                               head0: ADDRESS;
  91.                               var0: ADDRESS;
  92.                               varlen0: LONGCARD;
  93.                               flags: BITSET;
  94.                             END;
  95.              modNo        : CARDINAL;
  96.              processState : CARDINAL; (* 0:created, 1:init, 2:run, 3:term *)
  97.                                       (* 4:finished, 5:remove from memory *)
  98.              bottomOfStack: LONGWORD;
  99.              topOfStack   : LONGWORD;
  100.              termState    : CARDINAL;
  101.              resident     : BOOLEAN;
  102.              flags        : WORD; (* vom Linker: 0,1: RealFormat; 2: 68020-Code *)
  103.              termProcs    : TermList;
  104.              prev         : PtrPDB;
  105.              initialSSP   : LONGWORD;
  106.              prevTermHdlr : LONGWORD;
  107.              reserved     : ARRAY [2..3] OF LONGWORD;
  108.            END;
  109.  
  110. PROCEDURE GetPDB ( VAR pdb: PtrPDB; VAR process: ADDRESS );
  111.   (*
  112.    * Liefert NIL in pdb, wenn gerade kein MOS-Prozeß aktiv und ModLevel > 0.
  113.    * Wenn ein Prg also resident ist, bekommt es, wenn ModLevel = 0, zumindest
  114.    * seinen PDB, dessen Daten teilweise noch gültig sind (Stack-Ptr, resident,
  115.    * modLst, usw). Wenn Prg ein ACC ist und ModLevel=1, wird PDB geliefert.
  116.    * 'process' enthält immer akt. laufenden TOS-Prozeß (akt.Basepage)
  117.    *)
  118.  
  119. PROCEDURE PushPDB ( pdb: PtrPDB; process: ADDRESS );
  120.   (*
  121.    * Es muß die Adresse eines bereits angelegten
  122.    * und initialisierten PDB übergeben werden.
  123.    *)
  124.  
  125. PROCEDURE PopPDB;
  126.  
  127. PROCEDURE SetProcessState ( state: CARDINAL );
  128.   (*
  129.    * Muß unbedingt immer aufgerufen werden, weil hierin nicht nur
  130.    * der Prozeß-Status gesetzt, sondern auch abhängig davon andere
  131.    * Operationen durchgeführt werden! Also keinesfalls PDB.processState
  132.    * direkt setzen!
  133.    *)
  134.  
  135. PROCEDURE CallSub ( subRoutine: PROC; VAR wsp: MemArea );
  136.  
  137. PROCEDURE CallRemoveProcs;
  138.   (*
  139.    * Entfernt u.A. den Termination-Handler
  140.    *)
  141.  
  142. PROCEDURE Pterm (exitCode: INTEGER);
  143.   (*
  144.    * Ersatz für GEMDOS-Pterm(). Führt Abmeldefunktionen vorher aus.
  145.    *)
  146.  
  147. (*
  148.  * Folg. zwei Vars bezeichnen letzten aktiven MOS-Prozeß
  149.  *)
  150.  
  151. VAR ActPDB : PtrPDB;            (* Bleibt nach unterstem Prozeßende erhalten *)
  152.     ActMOSProcess: ADDRESS;     (* Ist NIL unter unterstem Prozeßlevel *)
  153.  
  154.     BaseProcess: ADDRESS;       (* Bei ACCs hier Base Page des ACC *)
  155.  
  156. END MOSCtrl.
  157.